package cn.harmonyoslearn.navrouter.models;

import cn.harmonyoslearn.navrouter.datas.JsonValue;
import cn.harmonyoslearn.navrouter.datas.NavName;
import cn.harmonyoslearn.navrouter.datas.NavrouterInfo;
import cn.harmonyoslearn.navrouter.utils.FileUtil;
import cn.harmonyoslearn.navrouter.utils.LogUtil;

import java.util.*;

/**
 * NavNames模块，用于处理页面名称等信息
 */
public class NavNamesModel {
    /**
     * NavPageNames.json 中的 Json 数据，整个文件的 Json
     */
    private JsonValue navNames;
    /**
     * 根目录路径
     */
    private final String basePath;
    public NavNamesModel(String basePath, NavrouterInfo navrouterInfo, RouterMapModel routerMap) {
        this.basePath = basePath;
        readObjectNavNames(navrouterInfo, routerMap);
    }

    /**
     * 从项目中重新加载 NavNames
     */
    public void readObjectNavNames(NavrouterInfo navrouterInfo, RouterMapModel routerMap) {
        // 更新为读取 navrouter-info.json
        // 读取 navNamesJson 中的数据
        String navNamesJsonPath = this.basePath + "/navrouter-info.json";
        String content = FileUtil.readFileContent(navNamesJsonPath);
        LogUtil.i("NavNamesModel.readObjectNavNames", "读取 navNamesJson 中的数据, content: " + content);

        // 保存 NavPageNames.json 中的所有数据以便后续存储
        try {
            this.navNames = new JsonValue(content);
        } catch (Exception e) {
            // 如果 NavPageNames.json 为空，则创建一个空的 names
            this.navNames = new JsonValue(new HashMap<>());
            this.navNames.addArrList("names", new ArrayList<>());
            this.navNames.addString("navNamesPath", "/common/NavRouter/src/main/ets/information/NavPageNames.ts");
            this.navNames.addBoolean("automaticDeletion", true);
        }

        if (!this.navNames.existence("names")) {
            this.navNames.addArrList("names", new ArrayList<>());
        }
        try {
            this.navNames.arrayList("names");
        } catch (Exception e) {
            this.navNames.value("names").setValue(new ArrayList<>());
        }

        LogUtil.i("NavNamesModel.readObjectNavNames", "读取 navNamesJson 中的数据, navNames: " + this.navNames.toJsonString());
    }

    /**
     * todo 增加一个回调，返回上一次与项目同步的时间，用于决定是否需要刷新
     * 添加一个NavPageNames页面
     *
     * @param pageName      文件名称
     * @param note          注释
     * @param routerMapPath RouterMap所在路径
     * @param filePath      文件所在路径
     */
    public void addPage(String pageName, String note, String routerMapPath, String filePath) {
        JsonValue value = new JsonValue(new HashMap<>());
        value.addString("name", pageName);
        value.addString("note", note);
        value.addString("routerMapPath", routerMapPath.replace(this.basePath, ""));
        value.addString("filePath", filePath.replace(this.basePath, ""));
        LogUtil.i("NavNamesModel.addPage", "添加一个NavPageNames页面, value: " + value.toJsonString());

        this.navNames.arrayList("names").add(value);
    }

    /**
     * 删除一个 NavPageNames 页面
     *
     * @param filePath 文件路径
     */
    public void deletePage(String filePath) {
        ArrayList<JsonValue> navNames = new ArrayList<>();

        ArrayList<JsonValue> jsonValues = this.navNames.arrayList("names", e -> {
            if (filePath.contains(e.getString("filePath", ""))) {
                return null;
            } else {
                return e;
            }
        });

        for (JsonValue jsonValue : jsonValues) {
            if (jsonValue != null) {
                navNames.add(jsonValue);
            }
        }

        LogUtil.i("NavNamesModel.deletePage", "删除一个 NavPageNames 页面, filePath: " + filePath);
        this.navNames.value("names").setValue(navNames);
    }

    /**
     * 将 NavPageNames 保存到配置的位置去
     */
    public void saveFile() {
        // 更新 保存到 navrouter-info.json 中
        NavrouterInfo navrouterInfoMap = NavrouterInfoModel.getNavrouterInfoMap(this.basePath);
        this.navNames.value("navNamesPath").setValue(navrouterInfoMap.navNamesPath);
        this.navNames.value("automaticDeletion").setValue(navrouterInfoMap.automaticDeletion);
        String jsonString = this.navNames.toJsonString();
        String jsonPath = basePath + "/navrouter-info.json";

        // 更新NavPageNames.ts文件
        ArrayList<NavName> names = new ArrayList<>();
        navNames.arrayList("names", e -> {
            NavName navName = this.getNavName(e);
            if (navName != null) {
                names.add(navName);
            }
            return "";
        });

        String tsPath = basePath + navrouterInfoMap.navNamesPath;
        String navPageNameTs = NavName.toNavPageNameTs(names);

        FileUtil.write(tsPath, navPageNameTs, false);
        FileUtil.write(jsonPath, jsonString, true);
        LogUtil.i("NavNamesModel.saveFile", "保存 NavPageNames.ts 文件, tsPath: " + tsPath + ", navPageNameTs: " + navPageNameTs + ", jsonPath: " + jsonPath + ", jsonString: " + jsonString);
    }

    public JsonValue getNavName() {
        return this.navNames.copy();
    }

    public ArrayList<NavName> getNavNames() {
        ArrayList<NavName> navNames = new ArrayList<>();
        for (NavName navName : this.navNames.arrayList("names", this::getNavName)) {
            if (navName != null) {
                navNames.add(navName);
            }
        }
        return navNames;
    }

    public void setNavNames(JsonValue navNames) {
        this.navNames.value("names").setValue(navNames.arrayList("names"));
    }


    /**
     * 从 JsonValue 中提取出 NavName
     *
     * @param jsonValue 需要确保是 NavName 需要的格式
     */
    private NavName getNavName(JsonValue jsonValue) {
        String name = jsonValue.getString("name", "");
        String note = jsonValue.getString("note", "");
        String routerMapPath = jsonValue.getString("routerMapPath", "");
        String filePath = jsonValue.getString("filePath", "");

        if (Objects.equals(name, "") || Objects.equals(routerMapPath, "") || Objects.equals(filePath, "")) {
            return null;
        }

        return new NavName(name, note, routerMapPath, filePath);
    }
}















